package Calculator;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.URL;


public class special_Calculator {
    public static void main(String[] args) {

        new MySpecialCalculator();
    }
}


class MySpecialCalculator extends Frame {
    Button num0;
    Button num1;
    Button num2;
    Button num3;
    Button num4;
    Button num5;
    Button num6;
    Button num7;
    Button num8;
    Button num9;

    Button button_sum;
    Button button_jian;
    Button button_dyu;
    Button panel4_button_mc;
    Button panel4_button_mr;
    Button panel4_button_ms;
    Button panel4_button_mjian;
    Button panel4_button_mjia;
    Button panel4_button1;
    Button panel4_button2;
    Button panel4_button3;
    Button panel4_button4;
    Button panel4_button5;
    Button button_che;
    Button button_chu;

    Panel panel1;
    Panel panel1_panel1;
    Panel panel2;
    Panel panel4;
    Panel panel5;

    Button num_fu1;
    Button num_fu2;
    Button num_fu3;
    Button num_fu4;
    // 下面三个额外 的操作不添加了哦，被数字 Button 位置给占了
//	Button num00;
//	Button num_fu5 ;
//	Button num_fu6;
    Button num000;


    TextField textField_shang;
    TextField textField_xia;


    // 初始化函数
    public MySpecialCalculator() {
        setBounds(100, 100, 300, 400);
        setVisible(true);
        this.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                 System.exit(0);
                 // 切换回不去了哦
//                new Calculator();
//                setVisible(false);
            }
        });

        setLayout(new GridLayout(4, 5));
        this.setResizable(false);

        /////////////////////////////////


        ///////////////////////////////////
        panel1 = new Panel();
        panel1.setLayout(new GridLayout(3, 1));
        panel1_panel1 = new Panel();
        panel1_panel1.setLayout(new FlowLayout());
        panel1_panel1.add(new Label("This is a special calculator !!!"), new FlowLayout(FlowLayout.CENTER));
//        panel1_panel1.add(new Label("More"), new FlowLayout(FlowLayout.CENTER));
//        panel1_panel1.add(new Label("More"), new FlowLayout(FlowLayout.RIGHT));

        panel1.add(panel1_panel1);


        textField_shang = new TextField();
        textField_shang.setSize(300, 10);
        textField_xia = new TextField();
        textField_xia.setSize(300,10);
        textField_shang.addActionListener(new MyActionListener());
        textField_xia.addActionListener(new MyActionListener());

        panel1.add(textField_shang);
        panel1.add(textField_xia);

        add(panel1);


        ////////////////// /////////////////////////
        panel4 = new Panel();
        panel4.setLayout(new GridLayout(2, 5));
        panel4_button_mc = new Button("MC");
        panel4_button_mr = new Button("【MR】");
        panel4_button_ms = new Button("【MS】");
        panel4_button_mjian = new Button("M+");
        panel4_button_mjia = new Button("M-");
        panel4_button1 = new Button("<==");
        panel4_button2 = new Button("CE");
        panel4_button3 = new Button("C");
        panel4_button4 = new Button("mod");
        panel4_button5 = new Button("/-");

        panel4.add(panel4_button_mc);
        panel4.add(panel4_button_mr);
        panel4.add(panel4_button_ms);
        panel4.add(panel4_button_mjian);
        panel4.add(panel4_button_mjia);
        panel4.add(panel4_button1);
        panel4.add(panel4_button2);
        panel4.add(panel4_button3);
        panel4.add(panel4_button4);
        panel4.add(panel4_button5);

        add(panel4);


        /////////////////////////////////////
        panel2 = new Panel();
        panel2.setLayout(new GridLayout(2, 5));
        num0 = new Button("0");
        num1 = new Button("1");
        num2 = new Button("2");
        num3 = new Button("3");
        num4 = new Button("4");
        num5 = new Button("5");
        num6 = new Button("6");
        num7 = new Button("7");
        num8 = new Button("8");
        num9 = new Button("9");
        button_sum = new Button(">>");
        button_jian = new Button("<<");
        button_dyu = new Button("==");


        panel2.add(num7);
        panel2.add(num8);
        panel2.add(num9);
        panel2.add(button_sum);
        panel2.add(button_jian);
        panel2.add(num4);
        panel2.add(num5);
        panel2.add(num6);
        button_che = new Button("x^y");
        panel2.add(button_che);


        // 按钮上添加标签，标签上加图片 (加不上啊)
//        button_chu = new JButton();
//        JButton labelx2 = new JButton();
//        URL resource = MySpecialCalculator.class.getResource("xx.jpg");
//
//        Icon icon = new ImageIcon(resource);
//        labelx2.setIcon(imageIcon1);
//        labelx2.setHorizontalAlignment(SwingConstants.CENTER);


//        button_chu = new JButton();
//        button_chu.setIcon(imageIcon1);
//        button_chu.add(labelx2);     // Swing 的 label 加在 Swing 的 button 里面得

//        JButton labelx2 = new JButton();
//        labelx2.setIcon(icon);
//        labelx2.setToolTipText("x^2");

//        button_chu.add(labelx2);


        button_chu = new Button("x^2");

        panel2.add(button_chu);

//		MyActionListener myActionListener = new MyActionListener();
//		num7.addActionListener(myActionListener);
//		num0.addActionListener(myActionListener);


        add(panel2);

        ////////////////////////
        panel5 = new Panel();
        panel5.setLayout(new GridLayout(2, 5));

        num_fu1 = new Button("o/o");
        num_fu2 = new Button("o/oo");
        num0 = new Button("0");
        num_fu3 = new Button("|__|");
        num_fu4 = new Button("1/x");
        num000 = new Button("&");


        panel5.add(num1);
        panel5.add(num2);
        panel5.add(num3);
        panel5.add(num_fu3);
        panel5.add(num_fu4);
        panel5.add(num_fu1);
        panel5.add(num0);
        panel5.add(num_fu2);
        panel5.add(num000);
        panel5.add(button_dyu);

        add(panel5);


        MyActionListener myActionListener = new MyActionListener();
        num0.addActionListener(myActionListener);
        num1.addActionListener(myActionListener);
        num2.addActionListener(myActionListener);
        num3.addActionListener(myActionListener);
        num4.addActionListener(myActionListener);
        num5.addActionListener(myActionListener);
        num6.addActionListener(myActionListener);
        num7.addActionListener(myActionListener);
        num8.addActionListener(myActionListener);
        num9.addActionListener(myActionListener);
        panel4_button_mc.addActionListener(myActionListener);     // "MC"
        panel4_button_mr.addActionListener(myActionListener);     // "【MR】"
        panel4_button_ms.addActionListener(myActionListener);     // "【MS】"
        panel4_button_mjian.addActionListener(myActionListener);     // "M+"
        panel4_button_mjia.addActionListener(myActionListener);     // "M-"
        button_sum.addActionListener(myActionListener);       // ">>"
        button_jian.addActionListener(myActionListener);      // "<<"
        button_che.addActionListener(myActionListener);       // "xy"        x 的 y 次方
        button_chu.addActionListener(myActionListener);       // "x2"        平方
        button_dyu.addActionListener(myActionListener);       // ”==“
        panel4_button1.addActionListener(myActionListener);    // "<=="
        panel4_button2.addActionListener(myActionListener);     // 清空下面的输出框   ”CE“
        panel4_button3.addActionListener(myActionListener);     // 清空上面的输入框    "C"

        panel4_button4.addActionListener(myActionListener);     // "mod"
        panel4_button5.addActionListener(myActionListener);     // "/-"

        num_fu3.addActionListener(myActionListener);           // "|__|"
        num_fu4.addActionListener(myActionListener);           // "1/x"
        num_fu1.addActionListener(myActionListener);           // "o/o"
        num_fu2.addActionListener(myActionListener);           // "o/oo"
        num000.addActionListener(myActionListener);            // ”&“

        // 基本计算器不实现   。    &
        // 超级计算器实现   。   &   <<   >>  toString   mod  o/o

    }
//
//	class MyActionListener_textField implements TextEvent {
//		public void textValueChanged(TextEvent e) {
//			textField_shang.setText("");
//		}
//	}


//    	String stringBuffer = "";
    StringBuffer stringBuffer = new StringBuffer();

    double get_num1 = 0;
    double get_num2 = 0;

    // 类中类（实现监听器），直接可以直接拿到上面的按钮上面的东西
    class MyActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
//			int nums = Integer.parseInt(num7.getLabel());
//			Button num_7 = (Button) e.getSource();
//
//			int num = Integer.parseInt(textField_shang.getText());
//			String str = num_7.getLabel();
//			System.out.println(str);


            if (e.getActionCommand().equals("0"))
                stringBuffer.append("0");
            if (e.getActionCommand().equals("1"))
                stringBuffer.append("1");
            if (e.getActionCommand().equals("2"))
                stringBuffer.append("2");
            if (e.getActionCommand().equals("3"))
                stringBuffer.append("3");
            if (e.getActionCommand().equals("4"))
                stringBuffer.append("4");
            if (e.getActionCommand().equals("5"))
                stringBuffer.append("5");
            if (e.getActionCommand().equals("6"))
                stringBuffer.append("6");
            if (e.getActionCommand().equals("7"))
                stringBuffer.append("7");
            if (e.getActionCommand().equals("8"))
                stringBuffer.append("8");
            if (e.getActionCommand().equals("9"))
                stringBuffer.append("9");

            // 按钮
            textField_shang.setText("" + stringBuffer);

            if (e.getActionCommand().equals(">>")){
                double num = get_num();
                num /= 2;
                textField_xia.setText("" + num);

                // 清空上面的输入框。因为 stringBuffer 和 textField_shang 的内容是同步的
                // 所以 stringBuffer 也要清空，避免影响后面的运算
                stringBuffer.delete(0, stringBuffer.length());
                textField_shang.setText("" + stringBuffer);
            }
            if (e.getActionCommand().equals("<<")){
                double num = get_num();
                num *= 2;
                textField_xia.setText("" + num);

                // 清空上面的输入框。因为 stringBuffer 和 textField_shang 的内容是同步的
                // 所以 stringBuffer 也要清空，避免影响后面的运算
                stringBuffer.delete(0, stringBuffer.length());
                textField_shang.setText("" + stringBuffer);
            }
            if (e.getActionCommand().equals("x^2")){
                double num = get_num();
                num *= num;
                textField_xia.setText("" + num);

                // 清空上面的输入框。因为 stringBuffer 和 textField_shang 的内容是同步的
                // 所以 stringBuffer 也要清空，避免影响后面的运算
                stringBuffer.delete(0, stringBuffer.length());
                textField_shang.setText("" + stringBuffer);
            }
            if (e.getActionCommand().equals("o/o")){   // 百分比
                double num = get_num();
                if(num > 0) num /= 100;
                else num = 0;
                textField_xia.setText("" + num);

                // 清空上面的输入框。因为 stringBuffer 和 textField_shang 的内容是同步的
                // 所以 stringBuffer 也要清空，避免影响后面的运算
                stringBuffer.delete(0, stringBuffer.length());
                textField_shang.setText("" + stringBuffer);
            }
            if (e.getActionCommand().equals("o/oo")){
                double num = get_num();
                if(num > 0) num /= 1000;
                else num = 0;
                textField_xia.setText("" + num);

                // 清空上面的输入框。因为 stringBuffer 和 textField_shang 的内容是同步的
                // 所以 stringBuffer 也要清空，避免影响后面的运算
                stringBuffer.delete(0, stringBuffer.length());
                textField_shang.setText("" + stringBuffer);
            }
            if (e.getActionCommand().equals("|__|")){
                // 输入一个空格
                stringBuffer.append(" ");

//                double num = get_num();
//                num *= -1;
//                textField_xia.setText("" + num);
//
//                // 清空上面的输入框。因为 stringBuffer 和 textField_shang 的内容是同步的
//                // 所以 stringBuffer 也要清空，避免影响后面的运算
//                stringBuffer.delete(0, stringBuffer.length());
//                textField_shang.setText("" + stringBuffer);
            }
            if (e.getActionCommand().equals("/-")) {     // 开根号的
                double num = get_num();
                if(num > 0) num = Math.sqrt(num);
                else num = 0;
                textField_xia.setText("" + num);

                // 清空上面的输入框。因为 stringBuffer 和 textField_shang 的内容是同步的
                // 所以 stringBuffer 也要清空，避免影响后面的运算
                stringBuffer.delete(0, stringBuffer.length());
                textField_shang.setText("" + stringBuffer);
            }
            if(e.getActionCommand().equals("==")){       // 无实际用途
                textField_xia.setText("" + stringBuffer);
            }

            if (e.getActionCommand().equals("1/x")) {


//				 判断 StringBuffer stringBuffer 字符串是否为空
                if (stringBuffer.length() == 0) {
                    num_fu4.setBackground(Color.red);
                    // 调用不了 textField_shang 输入框
//					textField_xia.setText("");
//					textField_xia.setText("" + "错误输入 5 秒后关闭窗口");
                    JOptionPane pane = new JOptionPane(JOptionPane.INFORMATION_MESSAGE);
                    JDialog dialog = pane.createDialog(null, "该对话框将在5秒后自动关闭");
                    dialog.setModal(false);
                    dialog.setVisible(true);

                    new TimedExit();
//					System.exit(0);
                }
                // 判断 stringBuffer 是否有非法字符，我们只需要 stringBuffer 是一个只有数字的连续字符串
                for (int i = 0; i < stringBuffer.length(); i++)
                    if (stringBuffer.charAt(i) < '0' || stringBuffer.charAt(i) > '9') {
                        num_fu4.setBackground(Color.red);
                        JOptionPane pane = new JOptionPane(JOptionPane.INFORMATION_MESSAGE);
                        JDialog dialog = pane.createDialog(null, "该对话框将在5秒后自动关闭");
                        dialog.setModal(false);
                        dialog.setVisible(true);
                        // 调用不了输入框
//						textField_xia.setText("");
//						textField_xia.setText("" + "错误输入 3 秒后关闭窗口");

                        new TimedExit();
//						System.exit(10);   // 作用和 System,exit(0) 一样
                    }

                // 正确输入的情况
                double ans = 0;
                int j = 0;
                while (j < stringBuffer.length() && stringBuffer.charAt(j) <= '9' && stringBuffer.charAt(j) >= '0') {
                    ans = ans * 10 + (stringBuffer.charAt(j) - '0');
                    j++;
                }

                if(ans > 0) ans = 1 / ans;
                else ans = 0;
                textField_xia.setText("" + ans);
            }
            if (e.getActionCommand().equals("<==")) {
                // 点一次就输出 stringBuffer 最后一个字符
                stringBuffer.deleteCharAt(stringBuffer.length() - 1);
            }
            if (e.getActionCommand().equals("C")) {     // 清空上面的输入框
                // 清空 stringBuffer 要操作的表达式
//				stringBuffer.delete(0, stringBuffer.length());
                // 因为后面 stringBuffer 字符串还是从 textField_shang 的输入框得到的，所以得清空上面输入框的内容
//				textField_shang.setText("");    // 不能直接调用

//				disTextField_shang();    // 直接在 class 外面实现清空 textField_shang 的函数里面直接调用

                // 也可以放在里面来实现
                stringBuffer.delete(0, stringBuffer.length());
                textField_shang.setText("" + stringBuffer);
            }
            if (e.getActionCommand().equals("CE")) {     // 清空下面的输出框
                String kong = "";
                textField_xia.setText("" + kong);
            }
            if (e.getActionCommand().equals("MC")) {    // 把上下两个 TextField 都清空的
                String kong = "";
                textField_xia.setText("" + kong);
                // 下面会 textField_shang.setText("" + stringBuffer);  所以这里直接清空 stringBuffer 就可以了哦
                stringBuffer.delete(0, stringBuffer.length());
				textField_shang.setText("" + kong);
            }
            // 一次性计算不用记录了
            if (e.getActionCommand().equals("【MR】")) {    //  查看上一次计算结果的
//                // 新开的面板不好关闭，会把用来的计算器也关闭了，就直接把数据 set 在输出框了哦
//
//                if(len >= 2) textField_xia.setText("上一次计算表达式 ： " + stringBuffers[len - 2]);
//                else  textField_xia.setText("上一次计算表达式没有，计算的次数太少了哦 ！！！");
            }
            // 一次性计算不用记录了
            if (e.getActionCommand().equals("【MS】")) {    // 查看上一次计算字符串的
//                // 新开的面板不好关闭，会把用来的计算器也关闭了，就直接把数据 set 在输出框了哦
//
//                if(len >= 2) textField_xia.setText("上一次计算结果 ： " + double_ans[len - 2]);
//                else  textField_xia.setText("上一次计算结果没有，计算的次数太少了哦 ！！！");
            }
            if (e.getActionCommand().equals("M+")) {        // 冒一个框后 5 秒关闭计算器
                JOptionPane pane = new JOptionPane(JOptionPane.INFORMATION_MESSAGE);
                JDialog dialog = pane.createDialog(null, "内存添加");
                dialog.setModal(false);
                dialog.setVisible(true);


                new TimedExit();
            }
            if (e.getActionCommand().equals("M-")) {    // 冒一个框后 5 秒关闭计算器
                JOptionPane pane = new JOptionPane(JOptionPane.INFORMATION_MESSAGE);
                JDialog dialog = pane.createDialog(null, "内存减少");
                dialog.setModal(false);
                dialog.setVisible(true);


                new TimedExit();
            }

            // 输入的两个数字中间有一个空格
            if (e.getActionCommand().equals("mod")) {      // 取模
                get_TwoNum();

//                System.out.println(get_num1 + " " + get_num2);

                //double ans = Math.floorMod((int)get_num1, (int)get_num2);
                while(get_num1 >= get_num2){
                    get_num1 -= get_num2;
                }

                textField_xia.setText("" + get_num1);

                // 计算完后就还原
                get_num1 = 0;
                get_num2 = 0;

                // 清空上面的输入框。因为 stringBuffer 和 textField_shang 的内容是同步的
                // 所以 stringBuffer 也要清空，避免影响后面的运算
                stringBuffer.delete(0, stringBuffer.length());
                textField_shang.setText("" + stringBuffer);
            }
            if (e.getActionCommand().equals("x^y")){
                get_TwoNum();

//                System.out.println(get_num1 + " " + get_num2);

                double ans = 1.0;
                for (int i = 0; i < get_num2; i++)
                    ans *= get_num1;

                textField_xia.setText("" + ans);

                // 计算完后就还原
                get_num1 = 0;
                get_num2 = 0;

                // 清空上面的输入框。因为 stringBuffer 和 textField_shang 的内容是同步的
                // 所以 stringBuffer 也要清空，避免影响后面的运算
                stringBuffer.delete(0, stringBuffer.length());
                textField_shang.setText("" + stringBuffer);
            }
        }

//        public void dis_textField_xia_shang(){
//            String kong = "";
//            textField_xia.setText("" + kong);
//            // 下面会 textField_shang.setText("" + stringBuffer);  所以这里直接清空 stringBuffer 就可以了哦
//            stringBuffer.delete(0, stringBuffer.length());
//            textField_shang.setText("" + kong);
//        }


        public double get_num(){
            double ans = 0.0;
            int j = 0;
            while (j < stringBuffer.length() && stringBuffer.charAt(j) <= '9' && stringBuffer.charAt(j) >= '0') {
                ans = ans * 10 + (stringBuffer.charAt(j) - '0');
                j++;
            }

            return ans;
        }

        // 得到两个数字（输入的两个数字中有一个空格）
        public void get_TwoNum(){
//            stringBuffer.reverse();

            int j = 0;
            while (j < stringBuffer.length()
                    && stringBuffer.charAt(j) <= '9' && stringBuffer.charAt(j) >= '0'
                    && stringBuffer.charAt(j) != ' ') {
                get_num1 = get_num1 * 10 + (stringBuffer.charAt(j) - '0');
                j++;
            }

            j++;    // 加 1 跳过上面的一个空格
            while (j < stringBuffer.length()
                    && stringBuffer.charAt(j) <= '9' && stringBuffer.charAt(j) >= '0') {
                get_num2 = get_num2 * 10 + (stringBuffer.charAt(j) - '0');
                j++;
            }

        }
    }
}
